/*
 * psg.c
 */
#include <system.h>
#include <v93.h>
#include <vpsg.h>
#include <intlib.h>
#include "spec.h"
#include "psgdef.h"

/*
  ＰＳＧ割り込み処理部の選択
  #define __USE_RASTER__ にするとラスター駆動
  #undef  __USE_RASTER__ にするとタイマー駆動
  になります。
  */
#define __USE_RASTER__

unsigned char cStageMusic[] = {
  0x01,		        /* ダミー */
  MU_STAGE1,		/* 1 */
  MU_STAGE2,		/* 2 */
  MU_STAGE3,		/* 3 */
};

/*
========================================
  ラスター割り込み駆動ルーチン
  適当なラスターに登録して使います。
  今回は１／１２０タイミングの曲を使うので
  130ラスター毎に呼び出されるように
  ２つ登録して使います。
========================================
*/
void
PSGInt()
{
  psg_drvcall();
}
/*
========================================
  タイマー割り込みルーチン
  １／１２０秒のタイミングで呼び出されます
  引き数：なし
  戻り値：なし
========================================
*/
void interrupt
TimerInt(void)
{
  regsave   r1-r31;
  _put_timer_tcr(0x0003);
  irq_disable();
  psg_drvcall();
  irq_enable();
}

/*
========================================
  PSG 初期化
  引き数：なし
  戻り値：なし
========================================
*/
void
PSGInit()
{
  /* ＰＳＧドライバーの初期化、アドレス設定 */
  psg_drvinit();
  psg_dataset((struct vpsgdata *)PSG_STARTADDRESS);
  psg_priset((unsigned char *)(*((unsigned char *)PSG_PRIADDRESS)));
  /* 割り込みルーチンの追加、動作開始 */
#ifdef __USE_RASTER__
  RasterSetOn(RASTER_PSG1,&PSGInt);
  RasterSetOn(RASTER_PSG2,&PSGInt);
#else
  IrqSet(TimerInt,XINT_TIM);
  /* １２０分の１秒割り込みタイミングの作り方 */
  /* １カウントは 1 / 1431818 (秒) なので，   */
  /*  (1/120) / (1/1431818) = 11932           */
  _put_timer_tmr(11932);  
  _put_timer_tcr(0x0001);
  _put_timer_tcr(0x0003);
  IrqOn(XINT_TIM);
#endif
  psg_drvon();
}
